﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using AVEIT.autogestionAVEIT.Negocio.Entidades;
using AVEIT.autogestionAVEIT.AccesoDatos;

namespace AVEIT.autogestionAVEIT.Negocio.Gestores
{
    public class GestorCliente
    {

        public static DataTable ObtenerTipoTelefono()
        {

            return ClientesDAO.consultarSQL("Select id_tipoTelefono, descripcion from TipoTelefono");
            
        }

        public static void GrabarCliente(Cliente cliente)
        {
            
            try
            {
                Validar(cliente);
                ClientesDAO.grabarCliente(cliente);
               
            }
            catch (Exception ex)
            {

                throw new ApplicationException("Error al grabar un cliente " + ex.Message.ToString());
                
            }
            

            //TODO ADO07) Implementar control de posible error en overflow campo nombre, mostrar un mensaje apropiado

        }

        private static void Validar(Cliente cliente)
        {
            
            string errores = "";
            if (cliente.Nombre.Length < 1 || cliente.Nombre.Length > 30)
                errores += "El nombre debe tener entre 10 y 40 caracteres <br>";
            if (cliente.Apellido.Length < 1 || cliente.Apellido.Length > 30)
                errores += "El nombre debe tener entre 10 y 40 caracteres <br>";
            if (errores != "")
                throw new Exception(errores);
        }

        public static Cliente obtenerCliente(int IdCliente)
        {
            try
            {
                return ClientesDAO.obtenerCliente(IdCliente);
            }
            catch (Exception ex)
            {

                throw new ApplicationException(ex.Message);
            }
        }

        public static void EliminarCliente(int IdCliente)  // este metodo no devuelve nada, si hay que informar algun evento anomalo usar una excepcion.
        {
            try
            {
                ClientesDAO.eliminarCliente(IdCliente);

            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("FK_"))
                    throw new Exception("No puede borrarse porque tiene tablas asociadas. ");
                else
                    throw new ApplicationException("Error al ejecutar la transaccion en la Base de Datos. " + ex.Message.ToString());
            }
            
            //TODO ADO05) Implementar transaccion al eliminar el cliente, grabando un registro en la tabla auditoria indicando la operacion realizada
            //datos auxiliares harcodeados para que al eliminar el registro se grabe estos datos en auditoria en una transaccion.
            string Tabla = "Clientes";  // Indica la tabla sobre la cual se realiza una operacion de ABM que es auditada
            string AccionABM = "B";   // Segun el caso completar con una letra: (A)lta, (B)aja, (M)odificaciones 
            string IdSession = "Session de Juan";  // Indica quien es el usuario logueado que realiza la operacion auditada
            string Observaciones = "pedido por el administrador...";  // datos adiciones de la operacion
            DateTime Fecha = DateTime.Now;
            int IdRegistro = IdCliente;  // Indica el campo clave del registro de la tabla auditada.



            //TODO ADO08) Controlar si se pudo borrar el registro, avisar con un mensaje apropiado si no pudo (probarlo con dos ventanas simulando dos usuarios concurrentes que pretendan borrar el mismo registro)
            //TODO ADO09) Controlar si falla la eliminacion por una restriccion de clave foranea, avisar con un mensaje apropiado (Probarlo con clientes que tengan movimientos en la tabla Ventas)
        }

        public static List<Cliente> ObtenerTodos()
        {
            try
            {
                return ClientesDAO.obtenerTodos();
            }
            catch (Exception ex)
            {

                throw new ApplicationException(ex.Message);
            }
  
        }
    }
}